// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者，助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件，未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------

import { login, logout, getInfo } from '@/api/user'
import { getToken, setToken, removeToken } from '@/utils/auth'
import router, { resetRouter } from '@/router'
import { isLoginApi } from '@/api/sms'
import Cookies from 'js-cookie'
import { oAuth, getQueryString } from "@/libs/wechat";

const state = {
  token: getToken(),
  name: '',
  avatar: '',
  introduction: '',
  roles: [],//crmeb中一个用户可能有多种角色
  isLogin: Cookies.get('isLogin'),
  isMessage: false, //是否有信息，默认没有
  permissions:[],
}

const mutations = {
  SET_TOKEN: (state, token) => {
    state.token = token
  },
  SET_ISLOGIN: (state, isLogin) => {
    state.isLogin = isLogin
    Cookies.set(isLogin)
  },
  SET_INTRODUCTION: (state, introduction) => {
    state.introduction = introduction
  },
  SET_NAME: (state, name) => {
    state.name = name
  },
  SET_AVATAR: (state, avatar) => {
    state.avatar = avatar
  },
  SET_ROLES: (state, roles) => {
    state.roles = roles
  },
  SET_ISMESSAGE: (state, isMessage) => {
    state.isMessage = isMessage
  },
  SET_PERMISSIONS: (state, permissions) => {
    state.permissions = permissions
  },
}

const actions = {
  // user login
  login({ commit }, userInfo) {
    const { account, pwd, key, code } = userInfo
    return new Promise((resolve, reject) => {
      login( userInfo ).then(data => {
      //后期接口调用
      /*let data={
        account:"demo",
        id:2,
        isSms:true,
        realName:"demo",
        token:"539b63dbc4f6454a99df8a1d3345b32d"
      }*/

      commit('SET_TOKEN', data.token)
        Cookies.set('JavaInfo', JSON.stringify(data))
        setToken(data.token)
        resolve()
      }).catch(error => {
        reject(error)
      })
    })
  },

  // get user info
  getInfo({ commit, state }) {
    return new Promise((resolve, reject) => {
      getInfo(state.token).then(data => {
        /*let data ={
          "id": 1,
          "departmentId": 1,
          "account": "admin",
          "pwd": "4CF37EE640372AA17D7F72ABDF1EA909",
          "realName": "超级管理员",
          "ipAddress": "",
          "macAddress": "",
          "roles": 1,
          "lastIp": "192.168.0.111",
          "lastLoginTime": "2023-03-20T06:56:33.000+00:00",
          "status": 1,
          "updateTime": "2023-02-26T13:51:30.000+00:00",
          "permissionList": [
            "admin:dashboard",
            "admin:department",
            "admin:person",
            "admin:backups",
            "admin:system",
            "admin:dataConfig",

            "admin:dashboard:list",

            "admin:system:role:list",
            "admin:system:role:save",
            "admin:system:role:update:status",
            "admin:system:role:info",
            "admin:system:role:delete",

            "admin:system:admin:list",
            "admin:system:admin:save",
            "admin:system:admin:update:status",
            "admin:system:admin:info",
            "admin:system:admin:delete",

            "admin:system:category:save",
            "admin:system:category:info",
            "admin:system:category:delete",
            "admin:system:category:update:status",
            "admin:system:category:phone:list",
            "admin:system:category:list",

            "admin:user:save",
            "admin:user:info",
            "admin:user:delete",
            "admin:user:update:status",
            "admin:user:detail",
            "admin:user:score",
            "admin:user:modify:phone",
            "admin:user:score:clear",
            "admin:user:list",

            "admin:department:delete",
            "admin:department:save",
            "admin:department:info",
            "admin:department:list",
            "admin:department:update:status",

            "admin:photo:delete",
            "admin:photo:save",
            "admin:photo:info",
            "admin:photo:list",

            "admin:notice:list",
            "admin:notice:save",
            "admin:notice:info",
            "admin:notice:delete",

            "admin:backups:list",
            "admin:backups:save",
            "admin:backups:restore",
            "admin:backups:down",
            "admin:backups:delete",

            "admin:maintain",
            "admin:system:attachment:list",
            "admin:system:attachment:download",
            "admin:system:attachment:upload",
            "admin:system:attachment:delete",
            "admin:system:attachment:move",

            "admin:message",
            "admin:message:list",
            "admin:message:info",
            "admin:photo:assign",
          ],
          "isMessage": false
        }*/

        if (!data) {
          reject('Verification failed, please Login again.')
        }

        data.roles = [data.roles] //crmeb中一个用户可能有多种角色，本系统只有一个用户和角色一对一，此处特殊处理
        const { roles, account } = data

        // roles must be a non-empty array
        if (!roles || roles.length <= 0) {
          reject('getInfo: roles must be a non-null array!')
        }

        commit('SET_ROLES', roles)
        // commit('SET_ROLES', ['admin'])
        commit('SET_NAME', account)
        // commit('SET_AVATAR', avatar)
        commit('SET_AVATAR', 'http://kaifa.crmeb.net/system/images/admin_logo.png')
        commit('SET_ISMESSAGE', data.isMessage)

        commit('SET_INTRODUCTION', 'HWSC admin')
        commit('SET_PERMISSIONS', data.permissionList) //权限标识
        resolve(data)
      }).catch(error => {
        reject(error)
      })
    })
  },

  // user logout
  logout({ commit, state, dispatch }) {
    return new Promise((resolve, reject) => {
      //logout(state.token).then(() => {
        commit('SET_TOKEN', '')
        commit('SET_ROLES', [])
        commit('SET_PERMISSIONS', [])
        removeToken()
        resetRouter()
        // localStorage.clear();
        //Cookies.remove('storeStaffList')
        Cookies.remove('JavaInfo')
        sessionStorage.removeItem('token')
        // reset visited views and cached views
        // to fixed https://github.com/PanJiaChen/vue-element-admin/issues/2485
        dispatch('tagsView/delAllViews', null, { root: true })

        resolve()
      /*}).catch(error => {
        reject(error)
      })*/
    })
  },

  // remove token
  resetToken({ commit }) {
    return new Promise(resolve => {
      commit('SET_TOKEN', '')
      commit('SET_ROLES', [])
      removeToken()
      resolve()
    })
  },
  // 设置token
  setToken({commit},state) {
    return new Promise(resolve => {
      commit('SET_TOKEN', state.token)
      Cookies.set('JavaInfo', JSON.stringify(state))
      setToken(data.token)
      resolve()
    })
  },

  // dynamically modify permissions
  changeRoles({ commit, dispatch }, role) {
    return new Promise(async resolve => {
      const token = role + '-token'

      commit('SET_TOKEN', token)
      setToken(token)

      const { roles } = await dispatch('getInfo')

      resetRouter()

      // generate accessible routes map based on roles
      const accessRoutes = await dispatch('permission/generateRoutes', roles, { root: true })

      // dynamically add accessible routes
      router.addRoutes(accessRoutes)

      // reset visited views and cached views
      dispatch('tagsView/delAllViews', null, { root: true })

      resolve()
    })
  },

  // 短信是否登录
  /*isLogin({ commit }, userInfo) {
    // const { username, password } = userInfo
    return new Promise((resolve, reject) => {
      isLoginApi().then(async res => {
        commit('SET_ISLOGIN', res.status)
        resolve(res)
      }).catch(res => {
        commit('SET_ISLOGIN', false)
        reject(res)
      })
    })
  },*/
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}
